Concurrency Handling এবং Transactions হল ডেটাবেস পরিচালনা এবং ডেটার সঠিকতা বজায় রাখার জন্য গুরুত্বপূর্ণ টপিক। Entity Framework (EF) এ এই দুটি টেকনিক ব্যবহার করে আপনি ডেটাবেসে একাধিক ক্লায়েন্ট বা থ্রেডের সাথে কাজ করতে পারবেন, যাতে ডেটার কোন অসামঞ্জস্যতা বা লকিং সমস্যা না হয়।
Concurrency তখন ঘটে যখন একাধিক ইউজার বা প্রক্রিয়া একই ডেটাতে সমান্তরালে কাজ করার চেষ্টা করে। যদি একাধিক ইউজার একই রেকর্ড আপডেট বা ডিলিট করার চেষ্টা করে, তবে Concurrency Issue দেখা দিতে পারে। EF তে Concurrency Handling করার জন্য কিছু প্রযুক্তি রয়েছে, যেমন Optimistic Concurrency।
Optimistic Concurrency এ, EF এটি অনুমান করে যে একটি রেকর্ড একাধিক ইউজারের দ্বারা একযোগে আপডেট হবে না। এর ফলে, আপডেটের আগে ডেটা চেক করা হয় এবং যদি অন্য কোনো ইউজার সেই ডেটাতে পরিবর্তন করে থাকে, তবে Concurrency Exception ছুঁড়ে দেওয়া হয়।
এটি হল সবচেয়ে সাধারণ পদ্ধতি যেখানে আপনি একটি Timestamp বা RowVersion ফিল্ড ব্যবহার করে Concurrency Handling করতে পারেন।
public class Product
{
public int ProductId { get; set; }
public string ProductName { get; set; }
[Timestamp]
public byte[] RowVersion { get; set; } // Concurrency control field
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Product>()
.Property(p => p.RowVersion)
.IsRowVersion(); // Row version to handle concurrency
}
try
{
dbContext.SaveChanges();
}
catch (DbUpdateConcurrencyException ex)
{
// Concurrency error occurred
Console.WriteLine("Concurrency conflict detected!");
}
এখানে, RowVersion
ফিল্ডটি ব্যবহার করা হয়েছে যা EF কে জানায় যে একটি রেকর্ডে পরিবর্তন করা হলে, তা শুধুমাত্র তখনই সেভ হবে যদি ঐ রেকর্ডের RowVersion এখনও আগের মতো থাকে।
Transactions হল একটি একগুচ্ছ কার্যক্রম বা অপারেশন যা একযোগে সম্পন্ন হতে হবে। অর্থাৎ, একটি ট্রানজেকশনে যদি কোনো একটি অপারেশন ব্যর্থ হয়, তবে সারা ট্রানজেকশনটি রোলব্যাক (rollback) হবে, অর্থাৎ, সকল পরিবর্তন পূর্বের অবস্থায় ফিরে যাবে। EF তে Transactions ব্যবহারের মাধ্যমে ডেটাবেসের সঠিকতা এবং অ্যাটমিক কার্যক্রম নিশ্চিত করা যায়।
EF Core এ ট্রানজেকশন ব্যবস্থাপনা করতে Transaction API ব্যবহার করা হয়।
using (var transaction = dbContext.Database.BeginTransaction())
{
try
{
// প্রথম অপারেশন
var product = new Product { ProductName = "New Product" };
dbContext.Products.Add(product);
dbContext.SaveChanges();
// দ্বিতীয় অপারেশন
var order = new Order { OrderDate = DateTime.Now };
dbContext.Orders.Add(order);
dbContext.SaveChanges();
// সব অপারেশন সফল হলে, কমিট করুন
transaction.Commit();
}
catch (Exception)
{
// কোনো সমস্যা হলে, ট্রানজেকশন রোলব্যাক করুন
transaction.Rollback();
}
}
এখানে, BeginTransaction() দিয়ে একটি নতুন ট্রানজেকশন শুরু করা হয় এবং তার পরবর্তী সব অপারেশনগুলো একযোগে সম্পন্ন হতে হবে। যদি কোনো অপারেশন ব্যর্থ হয়, তবে Rollback() মেথড ব্যবহার করে পূর্বের অবস্থায় ফিরে যেতে হবে।
Distributed Transactions হল একাধিক ডেটাবেস বা সার্ভারের মধ্যে একযোগে একটি ট্রানজেকশন পরিচালনা করা। এটি TransactionScope ব্যবহার করে পরিচালনা করা যায়, যা Microsoft Distributed Transaction Coordinator (MSDTC) এর মাধ্যমে কাজ করে।
using (var scope = new TransactionScope())
{
try
{
// প্রথম ডেটাবেসের অপারেশন
var customer = new Customer { Name = "John Doe" };
dbContext.Customers.Add(customer);
dbContext.SaveChanges();
// দ্বিতীয় ডেটাবেসের অপারেশন (যদি দুইটি আলাদা ডেটাবেস থাকে)
var order = new Order { OrderDate = DateTime.Now };
dbContext2.Orders.Add(order); // আলাদা dbContext
dbContext2.SaveChanges();
// সব অপারেশন সফল হলে, ট্রানজেকশন কমিট করুন
scope.Complete();
}
catch (Exception)
{
// কোনো সমস্যা হলে, ট্রানজেকশন রোলব্যাক করুন
// TransactionScope রোলব্যাক হবে স্বয়ংক্রিয়ভাবে
}
}
এখানে, TransactionScope ব্যবহার করে দুটি আলাদা ডেটাবেসে একযোগে ট্রানজেকশন পরিচালনা করা হয়েছে। যদি কোনো এক ডেটাবেসে সমস্যা হয়, তবে সব অপারেশন রোলব্যাক হয়ে যাবে।
বিষয় | Concurrency Handling | Transactions |
---|---|---|
মূল উদ্দেশ্য | একাধিক ইউজার বা প্রক্রিয়ার মধ্যে ডেটার সমন্বয় রক্ষা করা | একগুচ্ছ অপারেশন একযোগে সফলভাবে সম্পন্ন করা |
কিভাবে কাজ করে | একাধিক আপডেটের মধ্যে কনফ্লিক্ট চেক করা এবং প্রতিরোধ করা | একাধিক অপারেশন একযোগে সম্পন্ন হয় অথবা রোলব্যাক করা হয় |
ডেটাবেস ইন্টারঅ্যাকশন | এক রেকর্ড বা টেবিলের মধ্যে পরিবর্তন হয় | একাধিক অপারেশন একযোগে সম্পন্ন হয় |
ব্যবহার | RowVersion বা Timestamp ব্যবহার করে, Optimistic Concurrency | ট্রানজেকশন কমিট বা রোলব্যাক এর মাধ্যমে |
Optimistic Concurrency Control (OCC) একটি কৌশল যা ডেটাবেসের একাধিক ব্যবহারকারী বা প্রক্রিয়া যখন একই রেকর্ডে একসাথে কাজ করে, তখন কনফ্লিক্ট বা প্রতিযোগিতা (race condition) থেকে বাঁচতে ব্যবহৃত হয়। এটি ডেটাবেসে ডেটা কনফ্লিক্টের সম্ভাবনা কমাতে সহায়তা করে।
Optimistic Concurrency বিশেষভাবে ব্যবহার করা হয় যখন আপনি মনে করেন যে, একাধিক ব্যবহারকারী একসাথে একই ডেটাতে কাজ করার সময় খুব কম কনফ্লিক্ট হবে। এর মধ্যে, ডেটাবেসে কোনও রেকর্ড আপডেট করার আগে, কোনো লকিং মেকানিজম ব্যবহৃত হয় না। পরিবর্তে, আপডেট করার সময় সেই রেকর্ডের আগের অবস্থা চেক করা হয় এবং যদি ডেটা পরিবর্তিত হয়ে থাকে, তাহলে Concurrency Exception ঘটানো হয়।
Optimistic Concurrency Control প্যাটার্নে মূলত তিনটি ধাপ থাকে:
ধরা যাক, আপনি একটি Student টেবিল পরিচালনা করছেন যেখানে প্রতিটি ছাত্রের জন্য একটি RowVersion কলাম রয়েছে। এই কলামটি ডেটাবেসে প্রতিটি রেকর্ডের সময় বা পরিবর্তন ট্র্যাক করতে ব্যবহৃত হয়।
public class Student
{
public int StudentId { get; set; }
public string Name { get; set; }
public int Age { get; set; }
[Timestamp] // This annotation marks the RowVersion column for concurrency checking
public byte[] RowVersion { get; set; }
}
এখানে:
RowVersion
একটি Timestamp কলাম যা সিস্টেম ডেটাবেসে প্রতিটি রেকর্ডের পরিবর্তনের সময় ট্র্যাক করে।public class ApplicationDbContext : DbContext
{
public DbSet<Student> Students { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Student>()
.Property(p => p.RowVersion)
.IsRowVersion(); // Configuring RowVersion for concurrency handling
}
}
এখানে:
IsRowVersion()
Fluent API দিয়ে RowVersion
কলামটি কনফিগার করা হয়েছে যাতে এটি কনকারেন্সি চেকিংয়ের জন্য ব্যবহৃত হয়।এখন, যদি দুজন ব্যবহারকারী একই সময়ে একই ছাত্রের ডেটা আপডেট করার চেষ্টা করে, তবে Optimistic Concurrency এ কনফ্লিক্ট হবে এবং Concurrency Exception ঘটবে। এই ধরনের কনফ্লিক্ট হ্যান্ডেল করতে হলে, কনফ্লিক্ট নির্ধারণের পরে অ্যাপ্লিকেশনটিকে সেই ডেটাকে পুনরায় লোড করে ব্যবহারকারীকে অবহিত করতে হবে, অথবা ব্যবহারকারীকে নতুন করে ডেটা আপডেট করার সুযোগ দিতে হবে।
try
{
var student = db.Students.FirstOrDefault(s => s.StudentId == 1);
student.Name = "Updated Name";
db.SaveChanges();
}
catch (DbUpdateConcurrencyException)
{
// Handle concurrency conflict
Console.WriteLine("Concurrency conflict detected! The record has been modified by someone else.");
}
এখানে:
DbUpdateConcurrencyException
এক ধরনের Exception যা সংঘটিত হয় যখন ডেটাবেসে একই রেকর্ড আপডেট করার জন্য দুই বা ততোধিক প্রক্রিয়া চেষ্টা করে।Entity Framework-এ Optimistic Concurrency কনফিগার করতে RowVersion
বা Timestamp কলাম ব্যবহার করা হয়। EF সঠিকভাবে Concurrency Conflict হ্যান্ডলিং করে এবং একাধিক ব্যবহারকারী একই রেকর্ড আপডেট করার সময় Optimistic Concurrency Exception ছুঁড়ে দেয়।
এটি Concurrency Control প্যাটার্ন হিসেবে কার্যকর এবং বিশেষ করে সিস্টেমে যেখানে রেকর্ডের আপডেট রেট কম, সেখানে ভালো ফল দেয়।
Row Versioning এবং Timestamp হল Entity Framework (EF) এবং অন্যান্য ডেটাবেস সিস্টেমে ডেটার কনকারেন্ট অ্যাক্সেস এবং Concurrency Control নিশ্চিত করার জন্য ব্যবহৃত দুটি গুরুত্বপূর্ণ প্রযুক্তি। এই প্রযুক্তিগুলি একে অপরকে পরিপূরক করে এবং ডেটাবেসে একই ডেটা একাধিক ব্যবহারকারী বা প্রক্রিয়া দ্বারা আপডেট করার সময়ে কনফ্লিক্ট এবং ডেটা ক্ষতি থেকে রক্ষা করতে সাহায্য করে।
Row Versioning একটি ডেটাবেস কৌশল, যা ডেটা পরিবর্তনের সময় ডেটা আপডেট এবং কনকারেন্ট অ্যাক্সেস পরিচালনা করতে ব্যবহৃত হয়। Row Versioning এর মাধ্যমে, যখন একটি রেকর্ডে কোনো পরিবর্তন হয়, তখন সেই রেকর্ডের জন্য একটি unique version number (বা timestamp) তৈরি হয়। এটি ডেটাবেসের মধ্যে ডেটার প্রতিটি রোকে একটি অনন্য সংস্করণ ইন্ডিকেটর প্রদান করে, যা নিশ্চিত করে যে ডেটা পরিবর্তনের সময় কোনো কনফ্লিক্ট হয়নি।
EF তে, Row Versioning সাধারণত timestamp বা rowversion ডেটাটাইপ ব্যবহার করে।
ধরা যাক, আমাদের একটি Product
টেবিল রয়েছে, যেখানে আমরা একটি RowVersion
কলাম ব্যবহার করতে চাই যা ডেটা আপডেটের সময় ভার্সন ট্র্যাক করবে।
public class Product
{
public int ProductId { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
// RowVersion/ Timestamp column for concurrency control
[Timestamp]
public byte[] RowVersion { get; set; }
}
এখানে:
RowVersion
ফিল্ড হিসেবে ব্যবহৃত হবে এবং এটি কনকারেন্ট আপডেট ট্র্যাক করবে।byte[]
টাইপের RowVersion
কলামটি ডেটাবেসে একটি timestamp বা rowversion ডেটাটাইপ হিসেবে মান্য হবে, যা একটি বাইনারি টাইপ।Timestamp ডেটাবেসের একটি বিশেষ ধরনের কলাম যা একে অপরের মধ্যে ভিন্ন ভিন্ন ডেটা ভার্সন ট্র্যাক করতে ব্যবহৃত হয়। এটি মূলত একটি auto-generated ফিল্ড, যা প্রতিটি রেকর্ডে একটি ইউনিক বাইনারি মান (যেমন: byte[]
বা Guid
) ধারণ করে, যা যখন ডেটা আপডেট হয়, তখন পরিবর্তিত হয়।
EF তে Timestamp এবং RowVersion সাধারণত একে অপরের প্রতিস্থাপক হিসেবে ব্যবহৃত হয়, যদিও তাদের টেকনিকালি কিছু পার্থক্য থাকতে পারে (যেমন Timestamp
মূলত একটি SQL সার্ভার ডেটাটাইপ, তবে RowVersion
ও একই উদ্দেশ্যে ব্যবহৃত হতে পারে)।
আপনি EF তে একটি RowVersion কলাম ব্যবহার করলে, এটি ডেটাবেসের প্রতিটি রেকর্ডের জন্য একটি version number তৈরি করে, যা ডেটার আপডেটের সময় পরীক্ষা করা হয়। যখন আপনি রেকর্ড আপডেট করার চেষ্টা করেন, তখন EF পরীক্ষা করে যে আপনি যে ভার্সনটি আপডেট করতে চাইছেন, সেটি এখনও ডেটাবেসে বর্তমান আছে কিনা। যদি অন্য কোনো ব্যবহারকারী বা প্রক্রিয়া ইতিমধ্যে সেই রেকর্ড আপডেট করে থাকে, তাহলে EF আপনাকে একটি ConcurrencyException ছুড়ে দিবে, এবং আপনি একটি কনফ্লিক্ট সম্পর্কে অবহিত হবেন।
RowVersion
বা Timestamp
প্রপার্টি যোগ করুন, যাতে EF ডেটাবেসে এই প্রপার্টিকে একটি কনকারেন্ট কন্ট্রোল কলাম হিসেবে ব্যবহার করে।public class Product
{
public int ProductId { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
// RowVersion attribute for concurrency control
[Timestamp]
public byte[] RowVersion { get; set; }
}
Add-Migration AddRowVersionToProduct
Update-Database
এটি ডেটাবেসে RowVersion কলাম তৈরি করবে যা timestamp ডেটাটাইপ হিসেবে হবে।
using (var context = new YourDbContext())
{
var product = context.Products.FirstOrDefault(p => p.ProductId == 1);
if (product != null)
{
// Update the product's price
product.Price = 20.99M;
try
{
context.SaveChanges(); // Will check for concurrency conflict
}
catch (DbUpdateConcurrencyException ex)
{
// Handle concurrency conflict
Console.WriteLine("Concurrency conflict occurred.");
}
}
}
এখানে, SaveChanges() কল করার সময় EF চেক করবে যে RowVersion
কলামের মান আগের মত আছে কিনা, যদি না থাকে, তাহলে DbUpdateConcurrencyException ছুড়ে দেবে।
RowVersion বা Timestamp ব্যবহারের মাধ্যমে আপনি ডেটাবেসের ভার্সন ট্র্যাক করতে পারেন, যা অনেক সময় পারফরম্যান্সে সাহায্য করে। তবে, যদি একটি অ্যাপ্লিকেশন বা সিস্টেমে উচ্চমাত্রার কনকারেন্ট অ্যাক্সেস ঘটে, তবে ভার্সনিংয়ের ফলে কিছু পারফরম্যান্স ইস্যু হতে পারে (যেমন: অতিরিক্ত ডেটাবেস চেক), তবে এটি তুলনামূলকভাবে নিরাপত্তা এবং ডেটা অখণ্ডতার জন্য গুরুত্বপূর্ণ।
Database Transactions এবং SaveChanges মেথড হল Entity Framework (EF) এর গুরুত্বপূর্ণ ফিচার যা ডেটাবেসে একাধিক অপারেশন সম্পন্ন করার সময় ডেটার একনিষ্ঠতা এবং নিরাপত্তা নিশ্চিত করতে সহায়তা করে। যখন আপনি EF এর মাধ্যমে ডেটাবেসে পরিবর্তন করেন, তখন তা একটি ট্রানজেকশন হিসেবে বিবেচিত হয়, যার ফলে একাধিক পরিবর্তন একসাথে সফলভাবে সম্পন্ন হয় অথবা সবগুলো পরিবর্তন ব্যর্থ হলে ডেটাবেসের কোন পরিবর্তনই হয় না।
SaveChanges মেথড EF Context এর মাধ্যমে আপনার মডেল (Entity) এর পরিবর্তনগুলো ডেটাবেসে সেভ করে। এই মেথডটি মূলত সব পরিবর্তন যেমন ইনসার্ট, আপডেট এবং ডিলিট একসাথে ডেটাবেসে প্রেরণ করে।
using (var context = new SchoolContext())
{
var student = context.Students.First();
student.Name = "John Doe";
// SaveChanges মেথড দিয়ে পরিবর্তন সেভ করা
context.SaveChanges();
}
এখানে, SaveChanges মেথডে সমস্ত পরিবর্তন ডেটাবেসে সেভ হয়ে যাবে।
Database Transactions ব্যবহার করলে, আপনি একাধিক ডেটাবেস অপারেশন একসাথে গ্রুপ করতে পারেন, এবং একটিই ত্রুটি হলে পুরো অপারেশনটি রোলব্যাক (rollback) করা হয়। এতে করে ডেটাবেসের ডেটার একনিষ্ঠতা নিশ্চিত করা যায়। EF Context তে ট্রানজেকশন ব্যবস্থাপনা খুব সহজ এবং স্বচ্ছ।
using (var context = new SchoolContext())
{
// ট্রানজেকশন শুরু
using (var transaction = context.Database.BeginTransaction())
{
try
{
var student1 = new Student { Name = "Jane Doe", Age = 21 };
var student2 = new Student { Name = "Sam Smith", Age = 22 };
// প্রথম ইনসার্ট অপারেশন
context.Students.Add(student1);
context.SaveChanges();
// দ্বিতীয় ইনসার্ট অপারেশন
context.Students.Add(student2);
context.SaveChanges();
// যদি সবকিছু ঠিকঠাক থাকে, তাহলে কমিট
transaction.Commit();
}
catch (Exception)
{
// কোনো ত্রুটি হলে, রোলব্যাক
transaction.Rollback();
throw;
}
}
}
এখানে:
EF Core তে আপনি SaveChangesAsync মেথড ব্যবহার করে অ্যাসিঙ্ক্রোনাসভাবে ডেটাবেসে পরিবর্তন সেভ করতে পারেন। এটি দীর্ঘসময় ধরে চলা অপারেশনগুলির জন্য খুব কার্যকরী।
using (var context = new SchoolContext())
{
var student = new Student { Name = "Alice", Age = 23 };
context.Students.Add(student);
// Asynchronousভাবে SaveChanges কল করা
await context.SaveChangesAsync();
}
এখানে SaveChangesAsync মেথডটি অ্যাসিঙ্ক্রোনাসভাবে ডেটাবেসে পরিবর্তন সেভ করে, যা UI থ্রেডে কোনো বিলম্ব সৃষ্টি না করে, অ্যাপ্লিকেশনের পারফরম্যান্স উন্নত করে।
এখন, আপনি যদি ট্রানজেকশন এবং SaveChanges একসাথে ব্যবহার করতে চান, তবে আপনি দুটি অপারেশন একত্রিত করতে পারেন, যাতে একাধিক SaveChanges অপারেশন একযোগে কার্যকরী হয় এবং পুরো ট্রানজেকশনটি একসাথে সেভ হয় বা ব্যর্থ হলে রোলব্যাক হয়।
using (var context = new SchoolContext())
{
using (var transaction = context.Database.BeginTransaction())
{
try
{
var student1 = new Student { Name = "Anna", Age = 24 };
var student2 = new Student { Name = "Peter", Age = 26 };
context.Students.Add(student1);
context.SaveChanges(); // প্রথম SaveChanges
context.Students.Add(student2);
context.SaveChanges(); // দ্বিতীয় SaveChanges
// কমিট যদি সবকিছু ঠিক থাকে
transaction.Commit();
}
catch (Exception)
{
// কোনো ত্রুটি হলে, রোলব্যাক
transaction.Rollback();
throw;
}
}
}
এখানে:
Distributed Transactions এবং TransactionScope হল ডেটাবেস লেনদেনের ব্যবস্থাপনা করতে ব্যবহৃত শক্তিশালী টুলস, যা একাধিক ডেটাবেস বা সার্ভিসে ডেটা পরিবর্তন করার সময় ট্রানজেকশন নিশ্চিত করতে সহায়তা করে। এই টুলসগুলি মূলত ACID (Atomicity, Consistency, Isolation, Durability) গুণাবলী অনুসরণ করে, যা নিশ্চিত করে যে একটি ট্রানজেকশন সব অংশে সফলভাবে সম্পন্ন হবে বা কিছুই পরিবর্তন হবে না।
Distributed Transactions হল এমন একটি লেনদেন যা একাধিক ডেটাবেস বা অ্যাপ্লিকেশন পরিষেবার মধ্যে ছড়িয়ে থাকে। সাধারণত, যখন একাধিক ডেটাবেস সিস্টেম বা সার্ভিসে ডেটা পরিবর্তন করা হয় এবং সেই পরিবর্তনগুলো একসাথে কার্যকর হওয়া প্রয়োজন, তখন Distributed Transaction ব্যবহৃত হয়।
ডিস্ট্রিবিউটেড ট্রানজেকশন ব্যবস্থাপনা করার জন্য Two-Phase Commit Protocol (2PC) নামক একটি প্রোটোকল ব্যবহৃত হয়। এর মাধ্যমে ডিস্ট্রিবিউটেড সিস্টেমের প্রতিটি অংশ নিশ্চিত হয় যে ট্রানজেকশন সফলভাবে সম্পন্ন হয়েছে, না হলে পুরো লেনদেনটি বাতিল হয়ে যাবে।
TransactionScope হল .NET Framework-এর একটি ক্লাস যা একাধিক অপারেশনকে একক ট্রানজেকশনের অধীনে গ্রুপ করতে ব্যবহৃত হয়। এটি স্বয়ংক্রিয়ভাবে লেনদেন শুরু করে এবং শেষ করে, এবং যদি কোনো ত্রুটি ঘটে, তবে এটি পুরো ট্রানজেকশনটি রোলব্যাক করে দেয়। এটি সাধারণত Distributed Transactions-এ ব্যবহৃত হয়, তবে সাধারণ local transactions-এও ব্যবহার করা যায়।
TransactionScope ক্লাসটি একটি ট্রানজেকশনের সীমানা নির্ধারণ করতে সাহায্য করে এবং একটি একক ট্রানজেকশনের অধীনে একাধিক ডেটাবেস অপারেশন বা সার্ভিস কলের সমন্বয় ঘটায়।
Distributed Transactions এবং TransactionScope ব্যবহার করতে হলে প্রথমে কিছু সেটআপ এবং কনফিগারেশন প্রয়োজন হয়। নিচে TransactionScope ব্যবহার করে Distributed Transactions পরিচালনার উদাহরণ দেওয়া হলো:
ধরা যাক, আপনার একটি ASP.NET অ্যাপ্লিকেশন রয়েছে, যা দুটি ডেটাবেস সিস্টেমে ডেটা ইনসার্ট করবে। এখানে TransactionScope ক্লাস ব্যবহার করে ডিস্ট্রিবিউটেড ট্রানজেকশন পরিচালনা করা হয়েছে।
using System;
using System.Data.SqlClient;
using System.Transactions;
public class DistributedTransactionExample
{
public void ExecuteTransaction()
{
// TransactionScope তৈরি
using (TransactionScope scope = new TransactionScope())
{
try
{
// প্রথম ডেটাবেসে ইনসার্ট
using (SqlConnection connection1 = new SqlConnection("ConnectionString1"))
{
connection1.Open();
SqlCommand command1 = new SqlCommand("INSERT INTO Table1 (Column1) VALUES ('Data1')", connection1);
command1.ExecuteNonQuery();
}
// দ্বিতীয় ডেটাবেসে ইনসার্ট
using (SqlConnection connection2 = new SqlConnection("ConnectionString2"))
{
connection2.Open();
SqlCommand command2 = new SqlCommand("INSERT INTO Table2 (Column2) VALUES ('Data2')", connection2);
command2.ExecuteNonQuery();
}
// সব অপারেশন সফল হলে কমিট করা হবে
scope.Complete();
}
catch (Exception ex)
{
// কোনো ত্রুটি ঘটলে রোলব্যাক হবে
Console.WriteLine($"Error: {ex.Message}");
// TransactionScope এর অবস্থা রোলব্যাক হবে
}
}
}
}
এখানে:
scope.Complete()
মেথড কল করা হয়েছে, যা লেনদেনটি সফল হলে কমিট করবে।TransactionScope
ক্লাসটি কোডে কমপ্লেক্সিটি কমিয়ে দেয়। এটি ব্যবহারে কম কোড লিখতে হয় এবং ডেটাবেস অপারেশনগুলোর মধ্যে স্বয়ংক্রিয়ভাবে ট্রানজেকশন পরিচালিত হয়।TransactionScope
ম্যানেজমেন্টের মাধ্যমে লেনদেনের উন্নত পারফরম্যান্স পাওয়া যায়।Distributed Transactions এবং TransactionScope হল ডিস্ট্রিবিউটেড সিস্টেমে বা একাধিক ডেটাবেসের মধ্যে লেনদেন পরিচালনা করার শক্তিশালী টুলস। TransactionScope আপনাকে ডেটাবেস বা সিস্টেমে একাধিক অপারেশনকে একটি একক ট্রানজেকশনের অধীনে পরিচালনা করতে সাহায্য করে এবং যদি কোনো ত্রুটি ঘটে, তবে পুরো ট্রানজেকশন রোলব্যাক করে দেয়। এটি ডিস্ট্রিবিউটেড সিস্টেমে কাজ করার জন্য অপরিহার্য একটি কৌশল, বিশেষত তখন যখন একাধিক ডেটাবেস বা সার্ভিসে একযোগভাবে ডেটা আপডেট করতে হয়।
common.read_more